package com.zjsru.plan2025.oneday;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * 1399. 统计最大组的数目
 *
 * @Author: cookLee
 * @Date: 2025-04-23
 */
public class CountLargestGroup {

    /**
     * 主
     * \
     * 给你一个整数 n 。请你先求出从 1 到 n 的每个整数 10 进制表示下的数位和（每一位上的数字相加），然后把数位和相等的数字放到同一个组中。
     * \
     * 输入：n = 13
     * 输出：4
     * 解释：总共有 9 个组，将 1 到 13 按数位求和后这些组分别是：
     * [1,10]，[2,11]，[3,12]，[4,13]，[5]，[6]，[7]，[8]，[9]。总共有 4 个组拥有的数字并列最多。
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        CountLargestGroup countLargestGroup = new CountLargestGroup();
        int n = 13;
        System.out.println(countLargestGroup.countLargestGroup(n));
    }

    /**
     * 哈希表
     *
     * @param n n
     * @return int
     */
    public int countLargestGroup(int n) {
        Map<Integer, Integer> countMap = new HashMap<>();
        for (int i = 1; i <= n; i++) {
            int bigCount = this.helper(i);
            countMap.put(bigCount, countMap.getOrDefault(bigCount, 0) + 1);
        }
        Integer maxValue = countMap.values().stream().max(Integer::compareTo).get();
        int ans = 0;
        for (Map.Entry<Integer, Integer> kv : countMap.entrySet()) {
            if (Objects.equals(kv.getValue(), maxValue)) {
                ans++;
            }
        }
        return ans;
    }

    private int helper(int i) {
        int count = 0;
        while (i != 0) {
            count += i % 10;
            i = i / 10;
        }
        return count;
    }

}
